package com.hyt.it.ogt.kq.service.bm.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hyt.it.ogt.kq.service.bm.model.entity.BmStudentInfo;
import com.hyt.it.ogt.kq.service.bm.model.entity.StudentProject;
import com.hyt.it.ogt.kq.service.bm.model.vo.ProjectParam;
import com.hyt.it.ogt.kq.service.bm.model.vo.StudentStatVo;
import com.hyt.it.ogt.kq.service.gov.model.param.MessageParam;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Optional;

/**
 * <p>
 * 考生报名表 Mapper 接口
 * </p>
 *
 * @author wangt
 * @since 2020-05-15
 */
public interface StudentProjectMapper extends BaseMapper<StudentProject> {

    StudentProject getProjectStudentById(@Param("studentId") String studentId);

    StudentProject getProjectStudent(@Param("projectId") String projectId, @Param("regId") String regId);

    List<StudentProject> getProjectStudents(@Param("projectId") String projectId);

    String getExamId(@Param("projectId") String projectId, @Param("subjectId") String subjectId);

    List<StudentStatVo> statStudentByHour(ProjectParam param);

    List<StudentStatVo> statStudentByDate(ProjectParam param);

    List<StudentProject> getOfficeStudentIdList(@Param("officeId") String officeId, @Param("regId") String regId);

    /**
     * 获取区域下已报名人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaEnrolledNum(@Param("projectId") String projectId, @Param("areaCollectInfoId") String areaCollectInfoId, @Param("areaCode") String areaCode, @Param("deptId") String deptId);

    /**
     * 获取待审核人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaPendingNum(@Param("projectId") String projectId, @Param("areaCollectInfoId") String areaCollectInfoId, @Param("areaCode") String areaCode, @Param("deptId") String deptId);

    /**
     * 获取审核通过人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaPassAuditNum(@Param("projectId") String projectId, @Param("areaCollectInfoId") String areaCollectInfoId, @Param("areaCode") String areaCode, @Param("deptId") String deptId);

    /**
     * 获取审核未通过人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaFailAuditNum(@Param("projectId") String projectId, @Param("areaCollectInfoId") String areaCollectInfoId, @Param("areaCode") String areaCode, @Param("deptId") String deptId);

    /**
     * 获取待缴费人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaUnpaidNum(@Param("projectId") String projectId, @Param("areaCollectInfoId") String areaCollectInfoId, @Param("areaCode") String areaCode, @Param("deptId") String deptId);

    /**
     * 获取已缴费人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaPaidNum(@Param("projectId") String projectId, @Param("areaCollectInfoId") String areaCollectInfoId, @Param("areaCode") String areaCode, @Param("deptId") String deptId);

    /**
     * 获取已报名人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countEnrolledNum(@Param("projectId") String projectId, @Param("deptId") String deptId);

    /**
     * 获取待审核人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countPendingNum(@Param("projectId") String projectId, @Param("deptId") String deptId);

    /**
     * 获取审核通过人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countPassAuditNum(@Param("projectId") String projectId, @Param("deptId") String deptId);

    /**
     * 获取审核未通过人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countFailAuditNum(@Param("projectId") String projectId, @Param("deptId") String deptId);

    /**
     * 获取待缴费人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countUnpaidNum(@Param("projectId") String projectId, @Param("deptId") String deptId);

    /**
     * 获取已缴费人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countPaidNum(@Param("projectId") String projectId, @Param("deptId") String deptId);

    /**
     * 获取下一个待审核的考生
     *
     * @param projectId
     */
    String getNextToBeAuditStudent(String projectId);

    Integer getStudentCount(MessageParam param);

    List<BmStudentInfo> queryStudentList(MessageParam param);


    Integer getAllStudentCount(@Param("projectId") String projectId, @Param("deptId") String deptId);

    List<BmStudentInfo> allStudentList(@Param("projectId") String projectId, @Param("deptId") String deptId, @Param("startIndex") Integer startIndex,@Param("pageSize") Integer pageSize);

    Integer getRegisteredCount(@Param("projectId") String projectId, @Param("deptId") String deptId);

    List<BmStudentInfo> registeredList(@Param("projectId") String projectId, @Param("deptId") String deptId, @Param("startIndex") Integer startIndex,@Param("pageSize") Integer pageSize);

    Integer getNotRegisteredCount(@Param("projectId") String projectId, @Param("deptId") String deptId);

    List<BmStudentInfo> notRegisteredList(@Param("projectId") String projectId, @Param("deptId") String deptId, @Param("startIndex") Integer startIndex,@Param("pageSize") Integer pageSize);

}
